/**
 * script.ts 用于生成初始的sqlite数据
 * 文本放在项目根目录下 
 * 在项目根目录下执行：
 * >npx tsx script.ts
 * tsx没有安装的话，会提前示先安装；然后再执行一次上面命令.
 */


import {PrismaClient} from '@prisma/client';
import bcryt from 'bcrypt';

import { invoices, customers, revenue, users } from './app/lib/placeholder-data';


// PrismaClient在执行数据生成时自动生成，需要 @prisma/client 包支持才行。
// 应用程序通常只应创建一个 PrismaClient 的实例
// 每个 PrismaClient 实例都管理一个连接池，这意味着大量客户端可能会耗尽数据库连接限制。
const prisma = new PrismaClient();

async function main() {
    // 来自原始生成的 /app/seed/route.ts 
    // NOTE: 由于map()会返回很多Promise，所以需要使用Promise.all()来处理以保证表之间的依赖关系

    await Promise.all(
        users.map(async (user) => {
            const hashedPwd = await bcryt.hash(user.password, 10);
            // 添加一条记录
            await prisma.user.create({
                data: {
                    name: user.name,
                    email: user.email,
                    password: hashedPwd,
                },
            });
        })
    );

    await Promise.all(customers.map(async (customer) => {
        await prisma.customer.create({
                data: customer,
            });
        })
    );

    await Promise.all(
        invoices.map(async (invoice) => {
            await prisma.invoice.create({
                data: invoice,
            });
        })
    );

    await Promise.all(
        revenue.map(async (re) => {
            await prisma.revenue.create({
                data: re,
            });
        })
    );

}

main()
    .then(async () => {
        await prisma.$disconnect();
    })
    .catch(async (e) => {
        console.error(e);
        await prisma.$disconnect();
        process.exit(1);
    });

